上一篇學習了 Solidity 的基本結構,並使用 Truffle 來測試合約,這一篇將會深入講解 Solidity 有哪些型別可以使用喔~
在 Solidity 中有許多型別,有些是基本的型別,跟其他程式語言差不多的;有些則是特殊型別。
分為 有號整數 及 無號整數 ,長度設定則是以8的倍數至256,如下:
int8 public num = -127;
int16 public num2 = 32767;
int256 public num3 = -3;
int public num4 = 4; //相當於int256
uint8 public num5 = 255;
uint public num6 = 6; //相當於uint256
這個大家都不陌生吧!
bool public isTrue = true;
bool public isFalse = false;
在 HelloWorld 合約裡面有悄悄出現,在給定字串時,應使用雙引號而不是單引號。
string public message = "HelloWorld";
另外,在 Solidity 中,字串並 沒有 length 屬性,也 不能 用 index 的方式取得字元,如下:
string public message = "HelloWorld";
message.length; //error
message[0]; //error
有1~32位元組,如:bytes1, bytes32,有 length 屬性,可用來變更字串、讀取字串中的字元,算是很重要的型別。
bytes public buffer = "HelloWorld";
在字串變更或轉換時,遇到超過 1bytes 的字元時,那會發生問題,這部分需要注意一下。
可以設定 動態陣列 與 靜態陣列:
uint[] public arr; //動態陣列
uint[5] public arr2; //長度為5的靜態陣列
uint[2][2] arr3; //2行2列的二維陣列
arr.push(1); //添加1至arr
用來位址訊息,如:EOA 帳戶。
address public owner = 0xfd9ab01f1B3BcA9Ff27FD4DB6069aE04c5f88664;
用來自定義資料格式的型別。
struct Profile {
string name;
uint8 age;
}
Profile user = Profile({ name: "John", age: 40 });
經常與 struct
搭配用。
enum Member {
normal,
VIP
}
struct Profile {
string name;
uint8 age;
Member membership
}
Profile user = Profile({
name: "John",
age: 40,
membership: Member.VIP
});
可以把 mapping
視為是動態陣列,並可以透過 key 來查詢對應的 value ,且 key 只能是唯一的。
需要注意的是 key 的型別不能是 struct
與 enum
。
範例如下:
struct Profile {
string name;
uint8 age;
}
mapping(address => uint) public balances;
mapping(Profile => uint) public balances; //error
在 Solidity 中,並 沒有 這個型別,只有整數,我們不計較那小數目的。
將 Solidity 的資料型別整理一下: